import type { FileInfo } from '#/api/openapi';

import { acceptHMRUpdate, defineStore } from 'pinia';

// 带有下载记录的文件信息
export interface FileInfoWithDownloadHistory extends FileInfo {
  code: string;
  lastDownloadTime?: number; // 最后下载时间戳
  localDownloadCount?: number; // 本地记录的下载次数
}

interface FilesState {
  files: FileInfoWithDownloadHistory[];
}

/**
 * 文件管理 Store
 */
export const useFilesStore = defineStore('files', {
  state: (): FilesState => ({
    files: [],
  }),

  getters: {
    // 获取所有文件（按最后下载时间排序，下载过的文件排在前面）
    getAllFiles: (state): FileInfoWithDownloadHistory[] => {
      return [...state.files].sort((a, b) => {
        // 如果两个文件都有下载时间，按下载时间降序排列
        if (a.lastDownloadTime && b.lastDownloadTime) {
          return b.lastDownloadTime - a.lastDownloadTime;
        }
        // 如果只有 a 有下载时间，a 排在前面
        if (a.lastDownloadTime && !b.lastDownloadTime) {
          return -1;
        }
        // 如果只有 b 有下载时间，b 排在前面
        if (!a.lastDownloadTime && b.lastDownloadTime) {
          return 1;
        }
        // 如果都没有下载时间，按 id 或文件名排序
        return (a.id || 0) - (b.id || 0);
      });
    },

    // 根据文件 ID 查找文件
    getFileById:
      (state) =>
      (id: number | string): FileInfoWithDownloadHistory | undefined => {
        return state.files.find((file) => file.id === id);
      },

    // 根据 MD5 查找文件
    getFileByMd5:
      (state) =>
      (md5: string): FileInfoWithDownloadHistory | undefined => {
        return state.files.find((file) => file.md5 === md5);
      },

    // 获取下载统计
    getDownloadStats: (state) => {
      const totalFiles = state.files.length;
      const downloadedFiles = state.files.filter(
        (file) => file.lastDownloadTime,
      ).length;
      const totalDownloads = state.files.reduce(
        (sum, file) => sum + (file.localDownloadCount || 0),
        0,
      );

      return {
        totalFiles,
        downloadedFiles,
        totalDownloads,
      };
    },
  },

  actions: {
    /**
     * 初始化文件数据
     */
    initFiles(files: FileInfoWithDownloadHistory[]) {
      this.files = files;
    },

    /**
     * 添加文件
     */
    addFile(file: FileInfoWithDownloadHistory) {
      const existingIndex = this.files.findIndex((f) => f.id === file.id);
      if (existingIndex === -1) {
        // 添加新文件
        this.files.push(file);
      } else {
        // 如果文件已存在，更新数据
        this.files[existingIndex] = { ...this.files[existingIndex], ...file };
      }
    },

    /**
     * 批量添加文件
     */
    addFiles(files: FileInfoWithDownloadHistory[]) {
      files.forEach((file) => this.addFile(file));
    },

    /**
     * 记录文件下载
     */
    recordFileDownload(code: string, newfile: FileInfo) {
      const { id: fileId, md5 } = newfile;
      let file: FileInfoWithDownloadHistory | undefined;

      // 首先通过 ID 查找
      if (fileId) {
        file = this.files.find((f) => f.id === fileId);
      }

      // 如果通过 ID 没找到，尝试通过 MD5 查找
      if (!file && md5) {
        file = this.files.find((f) => f.md5 === md5);
      }

      if (file) {
        // 更新下载记录
        file.lastDownloadTime = Date.now();
        file.localDownloadCount = (file.localDownloadCount || 0) + 1;

        // 如果原始 downloadCount 存在，也更新它
        if (typeof file.downloadCount === 'number') {
          file.downloadCount = (file.downloadCount || 0) + 1;
        }

        console.log(`文件 ${file.fileName} 下载记录已更新`, {
          localDownloadCount: file.localDownloadCount,
          lastDownloadTime: new Date(file.lastDownloadTime).toLocaleString(),
        });
      } else {
        console.log(`未找到文件 ID: ${fileId}, MD5: ${md5}，添加新文件记录`);
        // 如果没有找到文件，创建一个新的记录
        const newHistory: FileInfoWithDownloadHistory = {
          ...newfile,
          id: fileId || Date.now(), // 如果没有 ID，使用当前时间戳作为唯一标识
          lastDownloadTime: Date.now(),
          localDownloadCount: 1, // 初始化本地下载次数为 1
          code,
        };
        this.addFile(newHistory);
      }
    },

    /**
     * 更新文件信息
     */
    updateFile(
      fileId: number | string,
      updates: Partial<FileInfoWithDownloadHistory>,
    ) {
      const index = this.files.findIndex((file) => file.id === fileId);
      if (index !== -1) {
        const currentFile = this.files[index];
        if (currentFile) {
          this.files[index] = { ...currentFile, ...updates };
        }
      }
    },

    /**
     * 删除文件
     */
    removeFile(fileId: number | string) {
      const index = this.files.findIndex((file) => file.id === fileId);
      if (index !== -1) {
        this.files.splice(index, 1);
      }
    },

    /**
     * 清空所有文件
     */
    clearFiles() {
      this.files = [];
    },

    /**
     * 初始化示例数据（开发用）
     */
    initSampleData() {
      if (this.files.length === 0) {
        const sampleFiles: FileInfoWithDownloadHistory[] = [];
        this.initFiles(sampleFiles);
      }
    },
  },

  // 持久化配置
  persist: {
    key: 'files-store',
    storage: localStorage,
    pick: ['files'], // 只持久化 files 字段
  },
});

// 解决热更新问题
const hot = import.meta.hot;
if (hot) {
  hot.accept(acceptHMRUpdate(useFilesStore, hot));
}
